#!/usr/bin/env node

/**
 * Cursor Restore CLI 工具
 * 交互式命令行界面，提供激活码管理、一键特权、一键续杯功能
 */

const inquirer = require('inquirer');
const fs = require('fs');
const path = require('path');
const os = require('os');
const {
  executeRenewal,
  activatePrivilege,
  getActivationRules,
  getCursorAppRoot,
  getCursorVersion,
  getOrCreateUUID
} = require('./core.js');

// ============= 配置文件管理 =============

/**
 * 获取配置目录路径
 * 统一使用用户主目录下的 cursor-restore 目录
 */
function getConfigDir() {
  const homeDir = os.homedir();
  return path.join(homeDir, 'cursor-restore');
}

/**
 * 获取配置文件路径
 * 统一从用户主目录下的 cursor-restore/config.json 读取
 */
function getConfigFilePath() {
  return path.join(getConfigDir(), 'config.json');
}

/**
 * 确保配置目录存在
 */
function ensureConfigDir() {
  const configDir = getConfigDir();
  if (!fs.existsSync(configDir)) {
    try {
      fs.mkdirSync(configDir, { recursive: true });
    } catch (error) {
      console.error('创建配置目录失败:', error.message);
      throw error;
    }
  }
}

/**
 * 读取配置文件
 */
function loadCliConfig() {
  const configPath = getConfigFilePath();
  
  const defaultConfig = {
    card_code: '',
    token: ''
  };
  
  try {
    // 确保配置目录存在
    ensureConfigDir();
    
    if (fs.existsSync(configPath)) {
      const content = fs.readFileSync(configPath, 'utf-8');
      const config = JSON.parse(content);
      return { ...defaultConfig, ...config };
    } else {
      // 配置文件不存在，创建默认配置文件
      saveCliConfig(defaultConfig);
      return defaultConfig;
    }
  } catch (error) {
    console.error('读取配置文件失败:', error.message);
    return defaultConfig;
  }
}

/**
 * 保存配置文件
 */
function saveCliConfig(config) {
  const configPath = getConfigFilePath();
  
  try {
    // 确保配置目录存在
    ensureConfigDir();
    
    // 读取现有配置（如果存在）
    let currentConfig = {};
    if (fs.existsSync(configPath)) {
      try {
        const content = fs.readFileSync(configPath, 'utf-8');
        currentConfig = JSON.parse(content);
      } catch (error) {
        console.error('读取现有配置失败，将使用新配置:', error.message);
      }
    }
    
    const mergedConfig = { ...currentConfig, ...config };
    const content = JSON.stringify(mergedConfig, null, 2);
    fs.writeFileSync(configPath, content, 'utf-8');
    
    return true;
  } catch (error) {
    console.error('保存配置文件失败:', error.message);
    return false;
  }
}

// ============= UI 显示 =============

/**
 * 显示欢迎横幅
 */
function displayBanner() {
  console.clear();
  console.log('╔════════════════════════════════════════════╗');
  console.log('║     Cursor Restore - 激活管理工具          ║');
  console.log('╚════════════════════════════════════════════╝');
  console.log('');
}

/**
 * 显示当前配置状态
 */
function displayStatus() {
  const config = loadCliConfig();
  
  console.log('【当前配置状态】');
  console.log('─────────────────────────────────────────────');
  
  if (config.card_code) {
    console.log(`激活码: ${config.card_code}`);
  } else {
    console.log('激活码: 未配置');
  }
  
  if (config.token) {
    console.log(`Token: ${config.token.substring(0, 20)}...`);
  } else {
    console.log('Token: 未配置');
  }
  
  console.log('─────────────────────────────────────────────');
  console.log('');
  
  // 如果未配置，显示提示
  if (!config.card_code || !config.token) {
    console.log('⚠️  请先配置激活码和Token');
    console.log('');
  }
}

// ============= 菜单功能实现 =============

/**
 * 输入激活码
 */
async function inputCardCode() {
  console.log('\n【输入激活码】');
  console.log('─────────────────────────────────────────────');
  
  const answers = await inquirer.prompt([
    {
      type: 'input',
      name: 'card_code',
      message: '请输入激活码:',
      validate: (input) => {
        if (!input || input.trim() === '') {
          return '激活码不能为空';
        }
        return true;
      }
    }
  ]);
  
  const success = saveCliConfig({ card_code: answers.card_code.trim() });
  
  if (success) {
    console.log('✓ 激活码已保存');
  } else {
    console.log('✗ 激活码保存失败');
  }
  
  await waitForEnter();
}

/**
 * 输入Token
 */
async function inputToken() {
  console.log('\n【输入Token】');
  console.log('─────────────────────────────────────────────');
  
  const answers = await inquirer.prompt([
    {
      type: 'input',
      name: 'token',
      message: '请输入Token:',
      validate: (input) => {
        if (!input || input.trim() === '') {
          return 'Token不能为空';
        }
        return true;
      }
    }
  ]);
  
  const success = saveCliConfig({ token: answers.token.trim() });
  
  if (success) {
    console.log('✓ Token已保存');
  } else {
    console.log('✗ Token保存失败');
  }
  
  await waitForEnter();
}

/**
 * 一键特权
 */
async function executePrivilege() {
  console.log('\n【一键特权】');
  console.log('─────────────────────────────────────────────');
  
  const config = loadCliConfig();
  
  if (!config.card_code) {
    console.log('✗ 请先配置激活码');
    await waitForEnter();
    return;
  }
  
  try {
    console.log('正在获取激活规则...');
    const rules = await getActivationRules(config.card_code);
    
    if (!rules) {
      console.log('✗ 获取激活规则失败');
      console.log('\n可能原因：');
      console.log('  1. 激活码无效或已过期');
      console.log('  2. 网络连接问题');
      console.log('  3. 服务器暂时不可用');
      
      // 询问是否重新输入激活码
      const answers = await inquirer.prompt([
        {
          type: 'confirm',
          name: 'reinput',
          message: '是否重新输入激活码?',
          default: true
        }
      ]);
      
      if (answers.reinput) {
        await inputCardCode();
      }
      
      return;
    }
    
    console.log('✓ 激活规则获取成功');
    console.log('正在应用激活规则...');
    
    const result = await activatePrivilege(rules);
    
    if (result.success) {
      console.log(`✓ ${result.message}`);
      console.log('\n请重启 Cursor 使更改生效');
    } else {
      console.log(`✗ ${result.message}`);
    }
  } catch (error) {
    console.log('✗ 执行失败:', error.message);
  }
  
  await waitForEnter();
}

/**
 * 一键续杯
 */
async function executeRenewalAction() {
  console.log('\n【一键续杯】');
  console.log('─────────────────────────────────────────────');
  
  const config = loadCliConfig();
  
  if (!config.token) {
    console.log('✗ 请先配置Token');
    await waitForEnter();
    return;
  }
  
  try {
    console.log('正在执行续杯操作...');
    
    const result = await executeRenewal({ token: config.token });
    
    if (result.success) {
      console.log(`✓ ${result.message}`);
      console.log(`解锁方法: ${result.unlockMethod}`);
      
      if (result.cursorInfoSuccess) {
        console.log('\n.cursor_info 文件已更新');
      }
    } else {
      console.log(`✗ ${result.message}`);
    }
  } catch (error) {
    console.log('✗ 执行失败:', error.message);
  }
  
  await waitForEnter();
}

/**
 * 等待用户按回车
 */
async function waitForEnter() {
  await inquirer.prompt([
    {
      type: 'input',
      name: 'continue',
      message: '按回车键继续...',
      prefix: ''
    }
  ]);
}

// ============= 主菜单 =============

/**
 * 显示主菜单
 */
async function showMainMenu() {
  displayBanner();
  displayStatus();
  
  const answers = await inquirer.prompt([
    {
      type: 'list',
      name: 'action',
      message: '请选择操作:',
      choices: [
        { name: '输入激活码', value: 'input_card' },
        { name: '输入Token', value: 'input_token' },
        { name: '一键特权', value: 'privilege' },
        { name: '一键续杯', value: 'renewal' },
        { name: '退出', value: 'exit' }
      ]
    }
  ]);
  
  switch (answers.action) {
    case 'input_card':
      await inputCardCode();
      break;
    case 'input_token':
      await inputToken();
      break;
    case 'privilege':
      await executePrivilege();
      break;
    case 'renewal':
      await executeRenewalAction();
      break;
    case 'exit':
      console.log('\n再见！');
      process.exit(0);
      break;
  }
  
  // 执行完操作后返回主菜单
  await showMainMenu();
}

// ============= 程序入口 =============

/**
 * 主函数
 */
async function main() {
  try {
    await showMainMenu();
  } catch (error) {
    console.error('程序错误:', error);
    process.exit(1);
  }
}

// 启动程序
main();

